#ifndef CONFIG_HPP
#define CONFIG_HPP

#include <string>

/**
 * 应用程序配置结构体
 * 存储从配置文件加载的所有参数，包括相机设置、图像处理参数和测距参数
 * 每个参数都有默认值，在配置文件不存在或参数未指定时使用
 */
struct AppConfig {
    // -------- 相机和显示设置 --------
    int camera_index = 0;                        // 相机设备索引，0通常是默认相机
    std::string resolution_preset = "720p";      // 分辨率预设
    double display_scale_factor = 1.0;           // 显示缩放比例
    std::string window_title = "Live Camera Feed"; // 显示窗口标题
    bool show_binary = false;                    // 是否显示二值化图像窗口（用于调试）

    // -------- 图像处理参数 --------
    bool use_gaussian_blur = true;    // 是否应用高斯模糊预处理（减少噪点）
    int gaussian_kernel_size = 5;     // 高斯模糊核大小（必须是奇数）
    bool use_adaptive_threshold = true; // 是否使用自适应阈值（适用于光照不均的场景）
    int threshold_value = 127;        // 全局阈值值（仅在不使用自适应阈值时有效）
    int adaptive_block_size = 11;     // 自适应阈值的邻域块大小（必须是奇数）
    double adaptive_c = 2.0;          // 自适应阈值计算的常数调整值
    double min_contour_area = 1000.0; // 最小轮廓面积（过滤小噪点）
    
    // -------- 形状检测参数 --------
    double shape_detection_epsilon = 0.05; // 多边形近似精度系数（值越大，顶点越少，检测越宽松）
    double square_aspect_ratio_threshold = 0.2; // 正方形长宽比例阈值（允许的最大偏差，0.2表示长宽比在0.8-1.2之间）
    double square_side_variance_threshold = 0.3; // 正方形四边长度方差阈值（值越小，四边越接近等长）

    // -------- 角点验证参数 --------
    bool corner_check_enabled = true;     // 是否启用角点颜色稳定性验证
    int corner_check_distance = 3;        // 角点验证的采样距离（像素）

    // -------- 测距参数 --------
    double focal_length = 315.0;          // 相机焦距（像素单位，通过标定获得）
    double object_real_width_cm = 17.0;   // 标定物体的实际宽度（厘米）
    double object_real_height_cm = 25.7;  // 标定物体的实际高度（厘米）

    // -------- 调试参数 --------
    double ground_truth_distance_cm = 0.0; // [调试用] 目标的真实距离，用于反算焦距F。设为0表示不启用。
};

/**
 * 从指定的配置文件加载应用程序参数
 * 
 * @param filename 配置文件路径（通常是config.ini）
 * @param config 用于存储加载参数的AppConfig对象引用
 * @return 加载成功返回true，失败返回false
 * 
 * 配置文件格式为简单的键值对：
 * key=value
 * 
 * 函数会解析配置文件中的所有参数，并设置到config对象中
 * 对于配置文件中不存在的参数，将保留AppConfig结构体中的默认值
 * 对于格式错误或值超出有效范围的参数，会输出警告并使用默认值
 */
bool loadConfig(const std::string& filename, AppConfig& config);

#endif //CONFIG_HPP